package com.hanamaki.study.day02;

import org.checkerframework.checker.nullness.compatqual.NullableDecl;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.util.concurrent.TimeUnit;

public class FireFoxDriverTestNg04Wait {

    /* WebDriver 代表 浏览器 对象 */
    WebDriver driver;

    @BeforeClass
    public void setUp() {
        /* 1. 注册驱动的位置  */
        System.setProperty("webdriver.gecko.driver", "C:\\Program Files\\Mozilla Firefox\\geckodriver.exe");

        /* 2, 注册驱动 */
        driver = new FirefoxDriver();

        /* 因为隐式等待是 相对于全局元素声明的 所以可以直接定义在此  */
        WebDriver.Timeouts timeouts = driver.manage().timeouts();
        /**
         *10 代表 搜索时间
         * TimeUnit.SECONDS ： 时间单位 s
         */
        timeouts.implicitlyWait(10, TimeUnit.SECONDS);
        timeouts.pageLoadTimeout(10, TimeUnit.SECONDS);
        timeouts.setScriptTimeout(10, TimeUnit.SECONDS);

    }

    /**
     * 强制等待  Thread.sleep(3000)
     */
    @Test
    public void firefox() throws InterruptedException {
        /* 打开网址测试  */
        driver.get("https://www.baidu.com");
        /* 使用 css 的方式 来定位 百度中的搜索框并且为其  写入值 */
        WebElement element = driver.findElement(By.cssSelector("input.s_ipt"));
        element.sendKeys("selenium");


        /* 强制等待 */
        Thread.sleep(3000);

        /* 定位 按钮 实现点击 */
        driver.findElement(By.cssSelector("input#su")).click();

    }

    /**
     * 显示等待  是为某一个固定的元素添加的等待时间
     */
    @Test
    public void firefox1(){
        /* 打开网址测试  */
        driver.get("https://www.baidu.com");
        /* 使用 css 的方式 来定位 百度中的搜索框并且为其  写入值 */
        WebElement element = driver.findElement(By.cssSelector("input.s_ipt"));
        element.sendKeys("selenium");

        /* 如果 不清楚某一个元素的加载时间  那么尽量使用 显示等待或者隐式等待 在规定时间之内去搜索元素
        * 如果搜索到就立马执行操作  如果没有搜索到 就异常 */
        /* 想要使用 显示等待 首先需要使用 WebDriverWait 对象 */
        /*-*
        driver :代表的是浏览器驱动随想
        30：代表 一共要持续搜索 30 S
        1：每隔 1 S 搜索一次
         */
        WebDriverWait wait = new WebDriverWait(driver, 10, 1);

        /* 定位 按钮 实现点击 */
        WebElement until = wait.until(new ExpectedCondition<WebElement>() {

            @NullableDecl
            public WebElement apply(@NullableDecl WebDriver webDriver) {
                return driver.findElement(By.cssSelector("input#su"));
            }
        });

        until.click();


    }

    /**
     * 隐式等待  是为全局中的所有的 元素添加时间
     */
    @Test
    public void wait1() throws InterruptedException {

        /* 打开网址测试  */
        driver.get("https://www.baidu.com");
        /* 使用 css 的方式 来定位 百度中的搜索框并且为其  写入值 */
        WebElement element = driver.findElement(By.cssSelector("input.s_ipt"));
        element.sendKeys("selenium");

        /* 定位 按钮 实现点击 */
        driver.findElement(By.cssSelector("input#su")).click();

    }

}
